package com.waiting.reflection;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;

/**
 * @author bjweitingting
 * @description
 * @date 2018/8/21
 **/
public class MethodHandlerTest {
    private static void bar(Object o) {
        System.out.println("this is object bar..."+o.toString());
    }

    public static void main(String[] args) throws Exception {
        //方法句柄的第一步获取 MethodHandles.Lookup
        MethodHandles.Lookup lookup = MethodHandles.lookup();

        //一：通过反射API中的Method查找对应方法的方法句柄
        Method method = MethodHandlerTest.class.getDeclaredMethod("bar", Object.class);
        MethodHandle methodHandle = lookup.unreflect(method);

        //二：根据类、方法名以及方法句柄类型
        MethodType methodType = MethodType.methodType(void.class, Object.class);
        MethodHandle methodHandleTwo = lookup.findStatic(MethodHandlerTest.class, "bar", methodType);

        //方法句柄的调用
        try {
            methodHandle.invoke("通过方法句柄调用的");
            methodHandleTwo.invokeExact("严格方法严格匹配参数类型的 invokeExact");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}
